#include "Labirynt.h"

Labirynt::Labirynt() {
	gracz1x=1;
	gracz1y=1;
	gracz1kierunek=1;
	gracz2x=40;
	gracz2y=22;
	gracz1kierunek=1;
	pola = new char* [wymiarX];
	for(char i = 0; i<wymiarX ;i++)
	{
		pola[i]=new char[wymiarY];
		for(char j = 0; j<wymiarY ; j++)
		{
			pola[i][j]=PRZESZKODA;
			if(i%2==1 && j%2==1)
			{
				pola[i][j]=PUSTE;
				if(rand()%2)
					pola[i-1][j]=PUSTE;
				if(rand()%2)
					pola[i][j-1]=PUSTE;
			}
		}
	}
	//tworzenie "otoczki" labiryntu
	for(char i = 0; i<wymiarX ;i++)
	{
		pola[i][0]=PRZESZKODA;
		pola[i][wymiarY-1]=PRZESZKODA;
	}
	for(char i = 0; i<wymiarY ;i++)
	{
		pola[0][i]=PRZESZKODA;
		pola[wymiarX-1][i]=PRZESZKODA;
	}
	pola[gracz1x][gracz1y]=PUSTE;
	pola[gracz2x][gracz2y]=PUSTE;
	pola[21][12]=KONIEC;

}

bool Labirynt::znajdzSciezke(int srcx,int srcy,int dstx,int dsty,std::stack<char> * sciezka)
{
	char ** kolor = new char* [wymiarX];
		for(char i = 0; i<wymiarX ;i++)
		{
			kolor[i]=new char[wymiarY];
		}
	char ** poprzednik = new char* [wymiarX];
		for(char i = 0; i<wymiarX ;i++)
		{
			poprzednik[i]=new char[wymiarY];
		}
	std::queue<std::pair<int,int> > kolejka;
	kolejka.push(*(new std::pair<int,int> (srcx,srcy)));
	kolor[srcx][srcy]=1;
	poprzednik[srcx][srcy]=-1;
	while(!kolejka.empty())
	{
		int tempx = kolejka.front().first;
		int tempy = kolejka.front().second;
		kolejka.pop();
		//sprawdzenie czy sciezka nie zostala odnaleziona:
		if(tempx == dstx && tempy == dsty)
		{
			while(poprzednik[tempx][tempy]!=-1 && sciezka!=NULL)
						{
							//std::cerr << "Poprz: " << tempx << ", " <<tempy;
							sciezka->push(poprzednik[tempx][tempy]);
							if(poprzednik[tempx][tempy]==LEWO)
							{
								tempx++;
								//std::cerr<< "  Ruch: lewo \n" <<std::endl;
								continue;
							}
							if(poprzednik[tempx][tempy]==PRAWO)
							{
								tempx--;
								//std::cerr<< "  Ruch: prawo \n" <<std::endl;
								continue;
							}
							if(poprzednik[tempx][tempy]==GORA)
							{
								tempy++;
								//std::cerr<< "  Ruch: gora \n" <<std::endl;
								continue;
							}
							if(poprzednik[tempx][tempy]==DOL)
							{
								tempy--;
								//std::cerr<< "  Ruch: dol \n" <<std::endl;
								continue;
							}
						}
			return true;
		}

		//sprawdzanie sąsiednich pól
		if(pola[tempx+1][tempy]!=PRZESZKODA && kolor[tempx+1][tempy]!=1)
		{
			kolejka.push(*(new std::pair<int,int> (tempx+1,tempy)));
			poprzednik[tempx+1][tempy]=PRAWO;
			kolor[tempx+1][tempy]=1; //wierzcholek oznaczony jako odwiedzony
		}
		if(pola[tempx-1][tempy]!=PRZESZKODA && kolor[tempx-1][tempy]!=1)
		{
			kolejka.push(*(new std::pair<int,int> (tempx-1,tempy)));
			poprzednik[tempx-1][tempy]=LEWO;
			kolor[tempx-1][tempy]=1; //wierzcholek oznaczony jako odwiedzony
		}
		if(pola[tempx][tempy-1]!=PRZESZKODA && kolor[tempx][tempy-1]!=1)
		{
			kolejka.push(*(new std::pair<int,int> (tempx,tempy-1)));
			poprzednik[tempx][tempy-1]=GORA;
			kolor[tempx][tempy-1]=1; //wierzcholek oznaczony jako odwiedzony
		}
		if(pola[tempx][tempy+1]!=PRZESZKODA && kolor[tempx][tempy+1]!=1)
		{
			kolejka.push(*(new std::pair<int,int> (tempx,tempy+1)));
			poprzednik[tempx][tempy+1]=DOL;
			kolor[tempx][tempy+1]=1; //wierzcholek oznaczony jako odwiedzony
		}
	}
	return false;

}

bool Labirynt::poruszGraczem2()
{
	if(!sciezkaGracza2.empty())
	{
		switch(sciezkaGracza2.top())
		{
		case GORA:
			gracz2kierunek=GORA;
			gracz2y--;
			break;
		case DOL:
			gracz2kierunek=DOL;
			gracz2y++;
			break;
		case LEWO:
			gracz2kierunek=LEWO;
			gracz2x--;
			break;
		case PRAWO:
			gracz2kierunek=PRAWO;
			gracz2x++;
			break;

		default:
			break;
		}
		sciezkaGracza2.pop();
		// jeśli przeciwnik wygrał - zwróć true:
		if(getPole(gracz2x,gracz2y)==KONIEC)
			return true;
		return false;
	}
	return false;
}
Labirynt::~Labirynt() {
	// TODO Auto-generated destructor stub
}
